<?php
/**
 *钩子类
 *用于实现钩子函数，从而实现插件扩展的目的
 *@author oisc
 *2014/8/16
 */
class Hook{
	//存储钩子函数的静态数组
	private static $actions = array();
	//从插件目录中加载插件
	//暂时方案 以后版本会改成后台管理的
	public static function load_plugin(){
		$files = scandir(PLUGIN_PATH);
		foreach ($files as $file) {
			if(substr($file, strlen($file)-11, 11) == '.plugin.php'){
				include(PLUGIN_PATH.DS.$file);
			}
		}
	}
	/**
	 *添加钩子函数
	 *@param string $hook 钩子名称
	 *@param callable $function 钩子函数
	 *@param interval $priority 执行优先级
	 */
	public static function add_action($hook, $function, $priority=0){
		$hook = strtolower($hook);
		if(!self::exists_action($hook)){
			self::$actions[$hook] = array();
		}
		if(is_callable($function)){
			self::$actions[$hook][] = array($priority, $function);
		}
	}
	/**
	 *执行钩子函数
	 *@param string $hook
	 *@param array $params 参数
	 */
	public static function do_action($hook, $params=null){
		$hook = strtolower($hook);
		if(isset(self::$actions[$hook])){
			//对数组按priority进行排序
			usort(self::$actions[$hook], function($a, $b){
				if($a[0] == $b[0]) return 0;
				return $a[0] > $b[0] ? 1 : -1;
			});
			//按优先级执行函数
			foreach (self::$actions[$hook] as $f) {
				if(is_array($params)){
					call_user_func($f[1], $params);
				}else{
					call_user_func($f[1]);
				}
			}
		}
	}
	//钩子是否存在
	public static function exists_action($hook){
		$hook = strtolower($hook);
		return isset(self::$actions[$hook]);
	}
}